//
// Created by User on 24-10-3.
//

#include "stream.h"
#include "media_frame.h"
#include "media_packet.h"

extern "C" {
#include <libavformat/avformat.h>
}

namespace demuxer
{
    general_stream::general_stream(demuxer_interface& demuxer, AVStream* stream)
        : m_demuxer(demuxer), m_stream(stream)
    {
    }

    AVCodecParameters* general_stream::get_parameters() const
    {
        return this->m_stream->codecpar;
    }

    AVRational general_stream::get_timebase() const
    {
        return this->m_stream->time_base;
    }

    utils::media_packet general_stream::get_packet()
    {
        return this->m_demuxer.get_packet(this->m_stream->index);
    }

    AVStream* general_stream::get_stream() const
    {
        return this->m_stream;
    }

    int general_stream::total_frame() const
    {
        return this->m_stream->nb_frames;
    }

    video_stream::video_stream(demuxer_interface& demuxer, AVStream* stream)
        : m_stream(demuxer, stream)
    {
    }

    utils::media_packet video_stream::get_packet()
    {
        return this->m_stream.get_packet();
    }

    const AVCodecParameters* video_stream::get_codec() const
    {
        return this->m_stream.get_parameters();
    }

    AVRational video_stream::get_timebase() const
    {
        return this->m_stream.get_timebase();
    }

    AVStream* video_stream::get_stream() const
    {
        return this->m_stream.get_stream();
    }

    int video_stream::total_frames() const
    {
        return this->m_stream.total_frame();
    }

    audio_stream::audio_stream(demuxer_interface& demuxer, AVStream* stream)
        : m_stream(demuxer, stream)
    {
    }

    utils::media_packet audio_stream::get_packet()
    {
        return this->m_stream.get_packet();
    }

    const AVCodecParameters* audio_stream::get_codec() const
    {
        return this->m_stream.get_parameters();
    }

    AVRational audio_stream::get_timebase() const
    {
        return this->m_stream.get_timebase();
    }

    AVStream* audio_stream::get_stream() const
    {
        return this->m_stream.get_stream();
    }

    int audio_stream::total_frames() const
    {
        return this->m_stream.total_frame();
    }
} // demuxer
